from flask import Flask, render_template, session, g
from flask_login import LoginManager
from accounts.views import accounts
from models import db, User
from questions.views import qa
from utils.filter import number_split
from flask_ckeditor import CKEditor

app = Flask(__name__,static_folder='medias')

# 链接数据库
# app.config["SQLALCHEMY_DATABASE_URI"]='mysql://root:1234@112.74.189.60:3310/flask_qa'
# 从配置文件加载配置
app.config.from_object('conf.Config')

# 初始化数据库
db.init_app(app)

# 富文本初始化
ckeditor=CKEditor()
ckeditor.init_app(app)

# 注册蓝图
app.register_blueprint(accounts,url_prefix='/accounts')
app.register_blueprint(qa,url_prefix='/')

# 注册过滤器
app.jinja_env.filters['number_split']=number_split

# 初始化flask-login的登录功能
login_manager=LoginManager()
login_manager.login_view='account.login'
login_manager.login_message='请登录'
login_manager.login_message_category='danger'
login_manager.init_app(app)



# 获取全局的user对象,有了flask-login就不要这个了
# @app.before_request
# def before_request():
#     # 如果有用户id，设置到全局对象
#     user_id=session.get('user_id',None)
#     if user_id:
#         user=User.query.get(user_id)
#         g.current_user=user


"""
Flask-Login通过装饰器@login_required来检查访问视图函数的用户是否已登录，
没有登录时会跳转到login_manager.login_view = 'auth.login'所注册的登录页。
登录时即需调用login_user()函数，而在内部调用了由我们注册的回调函数。
Flask-Login就是通过装饰器，来注册回调函数，当没有sessionID时，通过装饰器指定的函数来读取用户到session中，
达到在前端模板中调用当前登录用户current_user的目的
"""
@login_manager.user_loader
def load_user(user_id):
    return User.query.get(user_id)



if __name__ == '__main__':
    app.run(debug=True)
